package cn.com.oyat.idea.util;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import com.baomidou.mybatisplus.generator.fill.Property;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Scanner;


public class MybatisPlusAutoGenerator {

	protected static String URL = "jdbc:sqlite:doc/bookmark.db";
	protected static String USERNAME = "";
	protected static String PASSWORD = "";

	protected static DataSourceConfig DATA_SOURCE_CONFIG = new DataSourceConfig.Builder(URL, USERNAME,
			PASSWORD).build();

	public static void main(String[] args) {
		//String mlg = "c:/";
		String mlg = System.getProperty("user.dir");
		System.out.println("请输入表名 , 多个英文逗号分隔");
		String[] tableNames = new Scanner(System.in).next().split(",");

		for (String tableName : tableNames) {

			AutoGenerator generator = new AutoGenerator(DATA_SOURCE_CONFIG);

			// 全局配置
			GlobalConfig globalConfig = new GlobalConfig.Builder()
					.fileOverride() // 如果文件存在，是否覆盖
					.outputDir( mlg+ "/src/main/java") // 生成文件的输出目录
					// .enableSwagger() // 是否开启Swagger2
					.commentDate("yyyy-MM-dd") // 注释中的日期格式
					.dateType(DateType.TIME_PACK) // 时间类型，默认使用java.util.Date
					.author("fuce")
					.build();

			generator.global(globalConfig);


			// 包配置(PackageConfig)
			PackageConfig packageConfig = new PackageConfig.Builder()
					.parent("cn.com.oyat")
					.moduleName("idea") // 设置父包模块名
					.entity("model")
					.service("service")
					.serviceImpl("service.impl")
					.controller("controller")
					.mapper("mapper")
					.xml("mapper.xml")
					.pathInfo(Collections.singletonMap(OutputFile.mapperXml,mlg + "\\src\\main\\resources\\mapper"))
					.build();

			generator.packageInfo(packageConfig);

			// 模板配置(TemplateConfig)
			TemplateConfig templateConfig = new TemplateConfig.Builder()
					.disable(TemplateType.ENTITY) // 禁用实体类的默认模板
					.entity("/mbGenerator/entity.java") // 自定义实体类模板文件路径
					.service("/mbGenerator/service.java") // 自定义服务接口模板文件路径
					.serviceImpl("/mbGenerator/serviceImpl.java") // 自定义服务实现类模板文件路径
					.mapper("/mbGenerator/mapper.java") // 自定义Mapper接口模板文件路径
					.mapperXml("/mbGenerator/mapper.xml") // 自定义XML映射文件模板文件路径
					.controller("/mbGenerator/controller.java") // 自定义控制器类模板文件路径
					.build();

			generator.template(templateConfig);

			// 策略配置
			StrategyConfig strategyConfig = new StrategyConfig.Builder()
					.enableCapitalMode() // 开启大写命名
					.enableSkipView() // 是否跳过视图
					.disableSqlFilter() // 禁用 SQL 过滤器
					.addInclude(tableName) // 需要包含的表名，使用正则表达式
					.addTablePrefix("t_", "c_")
					.entityBuilder().addTableFills(new Column("create_time", FieldFill.INSERT), new Column("update_time", FieldFill.INSERT_UPDATE)) // 设置过滤表前缀
					.build();


			// 实体配置
			strategyConfig.entityBuilder()
//                    .disableSerialVersionUID() // 禁用 serialVersionUID
					.enableChainModel() // 开启链式模型
					.enableLombok() // 开启Lombok
					.enableRemoveIsPrefix() // 移除字段名中的is前缀
					.enableTableFieldAnnotation() // 开启字段注解
					.enableActiveRecord() // 开启ActiveRecord模式
					.versionColumnName("version") // 乐观锁字段名
					.versionPropertyName("version") // 乐观锁属性名
					.logicDeleteColumnName("deleted") // 逻辑删除字段名
					.logicDeletePropertyName("deleted") // 逻辑删除属性名
//                    .naming(NamingStrategy.underline_to_camel) // 命名策略：不改变原始表名
                    .columnNaming(NamingStrategy.underline_to_camel) // 字段命名策略：下划线转驼峰
					.addTableFills(new Column("create_time", FieldFill.INSERT)) // 添加表填充字段
					.addTableFills(new Property("update_time", FieldFill.INSERT_UPDATE)) // 添加表填充属性
//                    .idType(IdType.AUTO) // 主键类型：自增
//                    .formatFileName(formatTableName) // 文件名格式化
					.build();

			// 根据名字取选择是否要格式化表名 我这里表名是XW_*
			String formatTableName =toCamelCase(tableName);

			// 控制器配置
			strategyConfig.controllerBuilder()
					.enableRestStyle() // 开启RestController风格
					.formatFileName(formatTableName + "Controller") // 控制器文件名格式化
					.build();

//			// 服务配置 service
//			strategyConfig.serviceBuilder()
//					.formatServiceFileName("I" + formatTableName + "Service") // 服务接口文件名格式化
//					.formatServiceImplFileName(formatTableName + "ServiceImpl") // 服务实现类文件名格式化
//					.superServiceImplClass("I" + formatTableName + "Service") // 设置父类为空，即不继承任何父类
//					.build();

			tableName = toCamelCase(tableName);
			// Mapper配置
			strategyConfig.mapperBuilder()
					.superClass(BaseMapper.class) // Mapper接口的父类
					.enableMapperAnnotation() // 开启Mapper注解
					.enableBaseResultMap() // 开启基本结果映射
					.enableBaseColumnList() // 开启基本列映射
					.formatMapperFileName(tableName + "Mapper") // Mapper接口文件名格式化
					.formatXmlFileName(tableName + "Mapper"); // XML映射文件名格式化

			generator.strategy(strategyConfig);
			FreemarkerTemplateEngine engine=new FreemarkerTemplateEngine();
			generator.execute(engine);

			ConfigBuilder config = engine.getConfigBuilder();
			List<TableInfo> tableInfoList = config.getTableInfoList();
			tableInfoList.forEach(tableInfo -> {
				Map<String, Object> objectMap = engine.getObjectMap(config, tableInfo);
				System.out.println(JSONUtil.toJsonStr(objectMap));
			});
		}

	}
	public static String toCamelCase(String s) {
		StringBuilder camelCaseStr = new StringBuilder();
		String[] parts = s.split("_");
		for (String part : parts) {
			camelCaseStr.append(toProperCase(part));
		}
		return camelCaseStr.toString();
	}

	public static String toProperCase(String s) {
		return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
	}
}
